/**
 * util.js  
 * 
 * 2016年3月18日13:51:54
 * 
 * 第三方工具类统一入口函数封装
 * 这样可以很好的管理第三方开发包
 * 替换、更新、调试、日志监控
 * 
 * @version 0.0.1
 * @author 710335997@qq.com
 * 
 */

var _ljs = require("./mmlog").root("[sever/util.js]");

var http = require("http");
var crypto = require('crypto');
var fs = require("fs");
var superagent = require("superagent");
var uuid = require("uuid");
var unzip = require("unzip");


var qiniu = require("qiniu");

var config =null,
	fileServer = null,
	bucket=null;

module.exports = {
	
	/**
	 * 这是util模块初始化化函数、用于参数传递 
	 */
	init:function(_configSelf){
		config=_configSelf;
		fileServer=config.file();
		qiniu.conf.ACCESS_KEY=fileServer.ak;
		qiniu.conf.SECRET_KEY=fileServer.sk;
		bucket = fileServer.bucket;
	},
	
	/**
	 * UUID 生成器 32位
	 */
	rid: function() {
		return uuid.v4().replace("-", "");
	},

	codeConfig: {
		0: "success",
		101001: "request param is error",
		101002: "system code exception",
		101003: "database op is error"
	},

	rColor: function() {
		return ('00000' + (Math.random() * 0x1000000 << 0).toString(16)).slice(-6);
	},

	/**
	 * 
	 * @param {Object} code
	 * @param {Object} res
	 */
	result: function(code, res) {
		var _this = this;
		res = res || _this.codeConfig[code];
		return {
			code: code,
			des: res
		};
	},

	isArray: function(obj) {
		return Object.prototype.toString.call(obj) === '[object Array]';
	},

	arrayString: function(array) {
		array.sort();
		return array.join("");
	},

	sha1: function(content) {
		var shasum = crypto.createHash('sha1');
		shasum.update(content);
		var d = shasum.digest('hex');
		return d;
	},


	/**
	 * 基于superagent开发包的网络请求工具
	 * get
	 * 用于http get请求交互
	 * @param {Object} url 网络请求url
	 * @param {Object} callback 
	 */
	get: function(url, callback) {

		var _ = this;

		superagent.get(url)
			.end(function(error, descr) {
				if (error) {
					callback(_.result(-1, error));
				} else {
					console.log(descr.text);
					callback(_.result(0, JSON.parse(descr.text)));
				}
			})
	},
	
	/**
	 * 基于superagent开发包的网络请求工具
	 * post
	 * 用于http post请求交互
	 * @param {Object} url 网络请求url
	 * @param {Object} data post参数
	 * @param {Object} callback 
	 */
	post: function(url, data, callback) {
		var _ = this;
		superagent.post(url)
			.send(data)
			.set('Content-Type', 'application/json;charset=utf-8;')
			.end(function(error, descr) {
				if (error) {
					callback(_.result(-1, error));
					_ljs.error("POST接口失败", error);
					_ljs.error("POST接口失败【url】", url);
					_ljs.error("POST接口失败【param】", data);
				} else {
					callback(_.result(0, JSON.parse(descr.text)));
					_ljs.info("POST接口【result】", descr.text);
				}
			})
	},

	agentSort: function(array) {
		var len = array.length,
			i, j, tmp;
		for (i = len - 1; i >= 1; i--) {
			for (j = 0; j <= i - 1; j++) {
				if (array[j].count > array[j + 1].count) {
					d = array[j + 1];
					array[j + 1] = array[j];
					array[j] = d;
				}
			}
		}
		return array;
	},
	
	/**
	 * ZIP包解压工具 
	 * @param {Object} filePath 解压目标文件
	 * @param {Object} targetPath 解压后输出文件目录
	 * @param {Object} callback 
	 */
	unzip: function(filePath, targetPath, callback) {
		try {
			fs.createReadStream(filePath).pipe(unzip.Extract({
					path: targetPath
				}))
				.on("close", function() {
					callback()
				});
		} catch (e) {
			_ljs.error("解压失败:", e);
		}
	},
	
	/**
	 * 简单的文件下载接口 alpha版
	 * 
	 * @version 0.0.1
	 * 
	 * @param {Object} url 远程文件地址
	 * @param {Object} name 下载后的文件名称 (默认存储在output目录下)
	 * @param {Object} callback
	 */
	downFile: function(url, name,callback) {
		var root="./output/",
			_file=root+name;
		var writestream = fs.createWriteStream(_file);
		http.get(url, function(_res) {
			_res.pipe(writestream);
		});
		writestream.on('finish', function() {
			callback(_file);
		});
	},

	/**
	 * QN 服务交互凭证生成器
	 * @param {Object} bucket 七牛空间名称
	 * @param {Object} key
	 */
	uptoken: function(bucket, key) {
		var putPolicy = new qiniu.rs.PutPolicy(bucket + ":" + key);
		return putPolicy.token();

	},

	/**
	 * QN 文件上传接口
	 * 基于QN文件云存储服务
	 * 
	 * @param {Object} url
	 * @param {Object} callback
	 */
	qnUpload: function(url, callback) {
		var _this = this;
		var _name = _this.rid();
		var extra = new qiniu.io.PutExtra();
		url = new Buffer(url).toString("base64");
		var br = new Buffer(bucket).toString("base64");
		var p = "http://iovip.qbox.me/fetch/" + url + "/to/" + br;
		superagent.post(p)
			.set('Content-Type', 'application/json;charset=utf-8;')
			.set('Authorization', qiniu.util.generateAccessToken(p))
			.end(function(error, descr) {
				if (error) {
					_ljs.error("Qiniu upload is Error", error);
					callback("/res/images/alt.png");
				} else {
					_ljs.info("Qiniu upload result ", descr.text);
					callback(fileServer.domain + JSON.parse(descr.text).key);
				}
			})
	},

	/**
	 * 七牛本地上传接口 
	 * 当前只支持mp3
	 * @param {Object} path 本地文件路径
	 * @param {Object} callback
	 */
	qnLocalUpload: function(path, callback) {
		var _this = this;
		var _name = _this.rid() + ".mp3";
		var _tk = _this.uptoken(bucket, _name);
		var extra = new qiniu.io.PutExtra();
		qiniu.io.putFile(_tk, _name, path, extra, function(err, ret) {
			if (!err) {
				_ljs.error("七牛文件上传成功:\n", ret);
				callback("","http://7xrn9i.com1.z0.glb.clouddn.com/"+_name);
			} else {
				_ljs.error("七牛文件上传失败:\n", err);
				callback(err,ret);
			}
		});
	},
	
	/**
	 * QN 文件格式转换接口
	 * 现在有问题不建议使用
	 * @param {Object} type 类型
	 * @param {Object} name 文件名称 (已上传的文件名称)
	 * @param {Object} callback 回掉函数
	 */
	qnFormatter:function(type,name,callback){
		var key=name;
		var line="abc";
		var fops="avthumb/mp3/ar/44100/aq/3";
		var opts={
		};
		var PFOP = qiniu.fop.pfop(bucket, key, fops, opts, function(err, ret) {
	      if(!err) {
	      	_ljs.error("七牛文件转换成功:\n", ret);
			callback(ret);
	        _ljs.log('curl '+'http://api.qiniu.com/status/get/prefop?id='+ret.persistentId);       
	      } else {
	      	_ljs.error("七牛文件转换失败:\n", err);
	      }
	  });
	},
	
	/**
	 * 微信媒体文件下载
	 * @param {Object} id 媒体id 微信传递过来的
	 * @param {Object} callback 异步回调函数
	 */
	wxDown: function(id, callback) {
		var _this=this,
			token=config.wechat("at");
		url = "http://file.api.weixin.qq.com/cgi-bin/media/get?access_token="+token+"&media_id="+id;
		_this.downFile(url,_this.rid()+".amr",function(name){
			_ljs.log("微信媒体文件下载:",name);
			//下载完成执行回调函数
			callback && callback(name);
		})
	}
}